package modules.jucAuxiliary;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * JUC 常用的辅助类
 *      Semaphore 信号量，在信号量定义两种操作：
 *      方法：
 *          acquire（获取）当一个线程调用acquire操作，它通过成功获取信号量（信号量-1），
 *              有阻塞，直到有线程释放信号量，或者超时。
 *          release（释放）实际上将信号量的值+1，然后唤醒等待的线程。
 * @author shengren.yan
 * @create 2021-03-10
 */
public class Auxiliary3 {
    public static void main(String[] args) {

        Semaphore semaphore = new Semaphore(3);
        for (int i=1;i<=10;i++){
            int atI = i;
            new Thread(()->{
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "  抢到停车位" + atI);
                    TimeUnit.SECONDS.sleep(2);
                    System.out.println(Thread.currentThread().getName() + "  离开停车场");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    //释放
                    semaphore.release();
                }

            },"线程"+i).start();
        }

//        原理：
//        semaphore.acquire()获得资源，如果资源已经使用完了，就等待资源释放后再进行使用！
//        semaphore.release()释放，会将当前的信号量释放+1，然后唤醒等待的线程！
//        作用： 多个共享资源互斥的使用！ 并发限流，控制最大的线程数！

    }
}
